<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   手把手,74行代码实现手写数字识别  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://dataunion.org/20992.html",
                  host: "http://dataunion.org",
                  prePath: "http://dataunion.org",
                  scheme: "http",
                  pathBase: "http://dataunion.org/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466460980: Accept with keywords: (title(0.25):社区,数字,手把手,代码,行,数盟,手写,识别, topn(0.633333333333):数字,数盟,步长,对模型,数据挖掘,测试集,过程,结果,人工智能,模型,准确率,参数,文章,手写,数据,节点,向量,权重,样本,调优,随机,梯度下降,启发式,误差,代码,交叉,神经网络,图像,思路,识别).-->
 </head>
 <body onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    手把手,74行代码实现手写数字识别
   </h1>
  </div>
  <div class="container" id="xmain">
   ﻿﻿
   <title>
    手把手,74行代码实现手写数字识别 | 数盟社区
   </title>
   <!-- All in One SEO Pack 2.2.7.6.2 by Michael Torbert of Semper Fi Web Design[32,64] -->
   <!-- /all in one seo pack -->
   <!--
<div align="center">
<a href="http://strata.oreilly.com.cn/hadoop-big-data-cn?cmp=mp-data-confreg-home-stcn16_dataunion_pc" target="_blank"><img src="http://dataunion.org/wp-content/uploads/2016/05/stratabj.jpg"/ ></a>
</div>
-->
   <header id="header-web">
    <div class="header-main">
     <hgroup class="logo">
      <h1>
       <a href="http://dataunion.org/" rel="home" title="数盟社区">
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/logo.png"/>
       </a>
      </h1>
     </hgroup>
     <!--logo-->
     <nav class="header-nav">
      <ul class="menu" id="menu-%e4%b8%bb%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-71" id="menu-item-71">
        <a href="http://dataunion.org/category/events" title="events">
         活动
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22457" id="menu-item-22457">
          <a href="http://dataunion.org/2016timeline">
           2016档期
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22459" id="menu-item-22459">
          <a href="http://dataunion.org/category/parterc">
           合作会议
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor menu-item-has-children menu-item-20869" id="menu-item-20869">
        <a href="http://dataunion.org/category/tech" title="articles">
         文章
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20867" id="menu-item-20867">
          <a href="http://dataunion.org/category/tech/base" title="base">
           基础架构
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-3302" id="menu-item-3302">
          <a href="http://dataunion.org/category/tech/ai" title="ai">
           人工智能
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3303" id="menu-item-3303">
          <a href="http://dataunion.org/category/tech/analysis" title="analysis">
           数据分析
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21920" id="menu-item-21920">
          <a href="http://dataunion.org/category/tech/dm">
           数据挖掘
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3314" id="menu-item-3314">
          <a href="http://dataunion.org/category/tech/viz" title="viz">
           可视化
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3305" id="menu-item-3305">
          <a href="http://dataunion.org/category/tech/devl" title="devl">
           编程语言
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20876" id="menu-item-20876">
        <a href="http://dataunion.org/category/industry">
         行业
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16328" id="menu-item-16328">
          <a href="http://dataunion.org/category/industry/case" title="case">
           行业应用
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-2112" id="menu-item-2112">
          <a href="http://dataunion.org/category/industry/demo" title="demo">
           Demo展示
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21562" id="menu-item-21562">
          <a href="http://dataunion.org/category/industry/news">
           行业资讯
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-311" id="menu-item-311">
        <a href="http://dataunion.org/category/sources" title="sources">
         资源
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20870" id="menu-item-20870">
        <a href="http://dataunion.org/category/books" title="book">
         图书
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21363" id="menu-item-21363">
        <a href="http://dataunion.org/category/training">
         课程
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-21853" id="menu-item-21853">
        <a href="http://dataunion.org/category/jobs">
         职位
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22050" id="menu-item-22050">
          <a href="http://dataunion.org/category/career">
           职业规划
          </a>
         </li>
        </ul>
       </li>
      </ul>
     </nav>
     <!--header-nav-->
    </div>
   </header>
   <!--header-web-->
   <div id="main">
    <div id="soutab">
     <form action="http://dataunion.org/" class="search" method="get">
     </form>
    </div>
    <div id="container">
     <nav id="mbx">
      当前位置：
      <a href="http://dataunion.org">
       首页
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech">
       文章
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech/ai">
       人工智能
      </a>
      &gt;  正文
     </nav>
     <!--mbx-->
     <article class="content">
      <header align="centre" class="contenttitle">
       <div class="mscc">
        <h1 class="mscctitle">
         <a href="http://dataunion.org/20992.html">
          手把手,74行代码实现手写数字识别
         </a>
        </h1>
        <address class="msccaddress ">
         <em>
          2,040 次阅读 -
         </em>
         <a href="http://dataunion.org/category/tech/ai" rel="category tag">
          人工智能
         </a>
        </address>
       </div>
      </header>
      <div class="content-text">
       <div>
        1、 引言：不要站在岸上学游泳
       </div>
       <div>
        “机 器学习”是一个很实践的过程。就像刚开始学游泳，你在只在岸上比划一堆规定动作还不如先跳到水里熟悉水性学习来得快。以我们学习“机器学习”的经验来看， 很多高大上的概念刚开始不懂也没关系，先写个东西来跑跑，有个感觉了之后再学习那些概念和理论就快多了。如果别人已经做好了轮子，直接拿过来用则更快。因 此，本文直接用Michael Nielsen先生的代码（github地址: https://github.com/mnielsen/neural-networks-and-deep-learning）作为例子，给大家展现 神经网络分析的普遍过程：导入数据，训练模型，优化模型，启发式理解等。
       </div>
       <div>
       </div>
       <div>
        本文假设大家已经了解python的基本语法，并在自己机器上运行过简单python脚本。
       </div>
       <div>
       </div>
       <div>
        2、 我们要解决的问题：手写数字识别
       </div>
       <div>
        手写数字识别是机器学习领域中一个经典的问题，是一个看似对人类很简单却对程序十分复杂的问题。很多早期的验证码就是利用这个特点来区分人类和程序行为的，当然此处就不提12306近乎反人类的奇葩验证码了。
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143939irvaxmsr0esx603m.jpg"/>
       </div>
       <div>
        回到手写数字识别，比如我们要识别出一个手写的“9”，人类可能通过识别“上半部分一个圆圈，右下方引出一条竖线”就能进行判断。但用程序表达就似乎很困难了，你需要考虑非常多的描述方式，考虑非常多的特殊情况，最终发现程序写得非常复杂而且效果不好。
       </div>
       <div>
       </div>
       <div>
        而用（机器学习）神经网络的方法，则提供了另一个思路：获取大量的手写数字的图像，并且已知它们表示的是哪个数字，以此为训练样本集合，自动生成一套模型（如神经网络的对应程序），依靠它来识别新的手写数字。
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143940clkn7jks7ehjklid.jpg"/>
       </div>
       <div>
        本文中采用的数据集就是著名的“MNIST数据集”。它的收集者之一是人工智能领域著名的科学家——Yann LeCu。这个数据集有60000个训练样本数据集和10000个测试用例。运用本文展示的单隐层神经网络，就可以达到96%的正确率。
       </div>
       <div>
       </div>
       <div>
        3、图解：解决问题的思路
       </div>
       <div>
        我们可以用下图展示上面的粗略思路。
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143940cr1ryo3m7jorkjw2.jpg"/>
       </div>
       <div>
        但是如何由“训练集”来“生成模型”呢？
       </div>
       <div>
       </div>
       <div>
        在这里我们使用反复推荐的逆推法——假设这个模型已经生成了，它应该满足什么样的特性，再以此特性为条件反过来求出模型。
       </div>
       <div>
       </div>
       <div>
        可 以推想而知，被生成的模型应该对于训练集的区分效果非常好，也就是相应的训练误差非常低。比如有一个未知其相应权重和偏移的神经网络，而训练神经网络的过 程就是逐步确定这些未知参数的过程，最终使得这些参数确定的模型在训练集上的误差达到最小值。我们将会设计一个数量指标衡量这个误差，如果训练误差没有达 到最小，我们将继续调整参数，直到这个指标达到最小。但这样训练出来的模型我们仍无法保证它面对新的数据仍会有这样好的识别效果，就需要用测试集对模型进 行考核，得出的测试结果作为对模型的评价。因此，上图就可以细化成下图：
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143940mjjh8frqhjr11r8b.jpg"/>
       </div>
       <div>
        但 是，如果我们已经生成了多个模型，怎么从中选出最好的模型？一个自然的思路就是通过比较不同模型在测试集上的误差，挑选出误差最小的模型。这个想法看似没 什么问题，但是随着你测试的模型增多，你会觉得用测试集筛选出来的模型也不那么可信。比如我们增加一个神经网络的隐藏层节点，就会产生新的对应权重，产生 一个新的模型。但是我也不知道增加多少个节点是合适的，所以比较全面的想法就是尝试测试不同的节点数x∈(1,2,3,4,…,100), 来观察这些不同模型的测试误差，并挑出误差最小的模型。这时我们发现我们的模型其实多出来了一个参数x， 我们挑选模型的过程就是确定最优化的参数x 的过程。这个分析过程与上面训练参数的思路如出一辙！只是这个过程是基于同一个测试集，而不训练集。那么，不同的神经网络的层数是不是也是一个新的参数 y∈(1,2,3,4,…,100), 也要经过这么个过程来“训练”？
       </div>
       <div>
       </div>
       <div>
        我 们会发现我们之前生成模型过程中很多不变的部分其实都是可以变换调节的，这些也是新的参数，比如训练次数、梯度下降过程的步长、规范化参数、学习回合数、 minibatch 值等等，我们把他们叫做超参数。超参数是影响所求参数最终取值的参数，是机器学习模型里面的框架参数，可以理解成参数的参数，它们通常是手工设定，不断试 错调整的，或者对一系列穷举出来的参数组合一通进行枚举（网格搜索）来确定。但无论如何，这也是基于同样一个数据集反复验证优化的结果。在这个数据集上最 后的结果并不一定在新的数据继续有效。所以为了评估这个模型的识别效果，就需要用新的测试集对模型进行考核，得出的测试结果作为对模型的评价。这个新的测 试集我们就直接叫“测试集”，之前那个用于筛选超参数的测试集，我们就叫做“交叉验证集”。筛选模型的过程其实就是交叉验证的过程。
       </div>
       <div>
       </div>
       <div>
        所以，规范的方法的是将数据集拆分成三个集合：训练集、交叉验证集、测试集，然后依次训练参数、超参数，最终得到最优的模型。
       </div>
       <div>
        因此，上图可以进一步细化成下图：
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143940nmm82s30m32m43mm.jpg"/>
       </div>
       <div>
        或者下图：
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143940wza6j454jxm5mvcz.jpg"/>
       </div>
       <div>
        可见机器学习过程是一个反复迭代不断优化的过程。其中很大一部分工作是在调整参数和超参数。
       </div>
       <div>
       </div>
       <div>
        4、先跑跑再说：初步运行代码
       </div>
       <div>
        Michael Nielsen的代码封装得很好，只需以下5行命令就可以生成神经网络并测试结果，并达到94.76%的正确率！
       </div>
       <div>
        <div>
         import mnist_loader
        </div>
        <div>
         import network
        </div>
        <div>
         # 将数据集拆分成三个集合：训练集、交叉验证集、测试集
        </div>
        <div>
         training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
        </div>
        <div>
         # 生成神经网络对象，神经网络结构为三层，每层节点数依次为（784, 30, 10）
        </div>
        <div>
         net = network.Network([784, 30, 10])
        </div>
        <div>
         # 用（mini-batch）梯度下降法训练神经网络（权重与偏移），并生成测试结果。
        </div>
        <div>
         # 训练回合数=30, 用于随机梯度下降法的最小样本数=10，学习率=3.0
        </div>
        <div>
         net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
        </div>
       </div>
       <div>
       </div>
       <div>
        第一个命令的功能是：将数据集拆分成三个集合：训练集、交叉验证集、测试集。
       </div>
       <div>
       </div>
       <div>
        第二个命令的功能是：生成神经网络对象，神经网络结构为三层，每层节点数依次为（784, 30, 10）。
       </div>
       <div>
       </div>
       <div>
        第三个命令的功能是：用（mini-batch）梯度下降法训练神经网络（权重与偏移），并生成测试结果。
       </div>
       <div>
       </div>
       <div>
        该命令设定了三个超参数：训练回合数=30, 用于随机梯度下降法的最小样本数（mini-batch-size）=10，步长=3.0。
       </div>
       <div>
       </div>
       <div>
        总共的输出结果如下：
       </div>
       <div>
        <div>
         Epoch 0: 9045 / 10000
        </div>
        <div>
         Epoch 1: 9207 / 10000
        </div>
        <div>
         Epoch 2: 9273 / 10000
        </div>
        <div>
         Epoch 3: 9302 / 10000
        </div>
        <div>
         Epoch 4: 9320 / 10000
        </div>
        <div>
         Epoch 5: 9320 / 10000
        </div>
        <div>
         Epoch 6: 9366 / 10000
        </div>
        <div>
         Epoch 7: 9387 / 10000
        </div>
        <div>
         Epoch 8: 9427 / 10000
        </div>
        <div>
         Epoch 9: 9402 / 10000
        </div>
        <div>
         Epoch 10: 9400 / 10000
        </div>
        <div>
         Epoch 11: 9442 / 10000
        </div>
        <div>
         Epoch 12: 9448 / 10000
        </div>
        <div>
         Epoch 13: 9441 / 10000
        </div>
        <div>
         Epoch 14: 9443 / 10000
        </div>
        <div>
         Epoch 15: 9479 / 10000
        </div>
        <div>
         Epoch 16: 9459 / 10000
        </div>
        <div>
         Epoch 17: 9446 / 10000
        </div>
        <div>
         Epoch 18: 9467 / 10000
        </div>
        <div>
         Epoch 19: 9470 / 10000
        </div>
        <div>
         Epoch 20: 9459 / 10000
        </div>
        <div>
         Epoch 21: 9484 / 10000
        </div>
        <div>
         Epoch 22: 9479 / 10000
        </div>
        <div>
         Epoch 23: 9475 / 10000
        </div>
        <div>
         Epoch 24: 9482 / 10000
        </div>
        <div>
         Epoch 25: 9489 / 10000
        </div>
        <div>
         Epoch 26: 9489 / 10000
        </div>
        <div>
         Epoch 27: 9478 / 10000
        </div>
        <div>
         Epoch 28: 9480 / 10000
        </div>
        <div>
         Epoch 29: 9476 / 10000
        </div>
       </div>
       <div>
       </div>
       <div>
        5、神经网络如何识别手写数字：启发式理解
       </div>
       <div>
        首先，我们解释一下神经网络每层的功能。
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143940eawmuhw67jvwkj76.jpg"/>
       </div>
       <div>
        第一层是输入层。因为mnist数据集中每一个手写数字样本是一个28*28像素的图像，因此对于每一个样本，其输入的信息就是每一个像素对应的灰度，总共有28*28=784个像素，故这一层有784个节点。
       </div>
       <div>
       </div>
       <div>
        第三层是输出层。因为阿拉伯数字总共有10个，我们就要将样本分成10个类别，因此输出层我们采用10个节点。当样本属于某一类（某个数字）的时候，则该类（该数字）对应的节点为1，而剩下9个节点为0，如[0,0,0,1,0,0,0,0,0,0]。
       </div>
       <div>
       </div>
       <div>
        因此，我们每一个样本（手写数字的图像）可以用一个超长的784维的向量表示其特征，而用一个10维向量表示该样本所属的类别（代表的真实数字），或者叫做标签。
       </div>
       <div>
       </div>
       <div>
        mnist的数据就是这样表示的。所以，如果你想看训练集中第n个样本的784维特征向量，直接看training_data[n][0]就可以找到，而要看其所属的标签，看training_data[n][1]就够了。
       </div>
       <div>
       </div>
       <div>
        那么，第二层神经网络所代表的意义怎么理解？这其实是很难的。但是我们可以有一个启发式地理解，比如用中间层的某一个节点表示图像中的某一个小区域的特定图像。这样，我们可以假设中间层的头4个节点依次用来识别图像左上、右上、左下、右下4个区域是否存在这样的特征的。
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143941ldbbudbmxpmvbuu3.jpg"/>
       </div>
       <div>
        如果这四个节点的值都很高，说明这四个区域同时满足这些特征。将以上的四个部分拼接起来，我们会发现，输入样本很可能就是一个手写“0”！
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143941zk44rrrt9krlrlop.jpg"/>
       </div>
       <div>
        因此，同一层的几个神经元同时被激活了意味着输入样本很可能是某个数字。
       </div>
       <div>
       </div>
       <div>
        当然，这只是对神经网络作用机制的一个启发式理解。真实的过程却并不一定是这样。但通过启发式理解，我们可以对神经网络作用机制有一个更加直观的认识。
       </div>
       <div>
       </div>
       <div>
        由此可见，神经网络能够识别手写数字的关键是它有能够对特定的图像激发特定的节点。而神经网络之所以能够针对性地激发这些节点，关键是它具有能够适应相关问题场景的权重和偏移。那这些权重和偏移如何训练呢？
       </div>
       <div>
       </div>
       <div>
        6、神经网络如何训练：进一步阅读代码
       </div>
       <div>
        上文已经图解的方式介绍了机器学习解决问题的一般思路，但是具体到神经网络将是如何训练呢？
       </div>
       <div>
       </div>
       <div>
        其实最快的方式是直接阅读代码。我们将代码的结构用下图展示出来，运用其内置函数名表示基本过程，发现与我们上文分析的思路一模一样：
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143941d4dpdr63ee2s6hzc.jpg"/>
       </div>
       <div>
        简单解释一下，在神经网络模型中：
       </div>
       <div>
       </div>
       <div>
        所需要求的关键参数就是：神经网络的权重(self.weights)和偏移(self.biases)。
       </div>
       <div>
        超参数是：隐藏层的节点数=30，训练回合数(epochs)=30, 用于随机梯度下降法的最小样本数（mini_batch_size）=10，步长(eta)=3.0。
       </div>
       <div>
        <img src="http://attach.dataguru.cn/attachments/portal/201512/29/143941o3qqcqiwdivqznln.jpg"/>
       </div>
       <div>
        用随机梯度下降法调整参数：
       </div>
       <div>
        用反向传播法求出随机梯度下降法所需要的梯度（偏导数）: backprop()
       </div>
       <div>
        用输出向量减去标签向量衡量训练误差：cost_derivative() = output_activations-y
       </div>
       <div>
       </div>
       <div>
        全部代码如下（去掉注释之后，只有74行）：
       </div>
       <div>
        <div>
         “””
        </div>
        <div>
         network.py
        </div>
        <div>
         ~~~~~~~~~~
        </div>
        <div>
        </div>
        <div>
         A module to implement the stochastic gradient descent learning
        </div>
        <div>
         algorithm for a feedforward neural network.  Gradients are calculated
        </div>
        <div>
         using backpropagation.  Note that I have focused on making the code
        </div>
        <div>
         simple, easily readable, and easily modifiable.  It is not optimized,
        </div>
        <div>
         and omits many desirable features.
        </div>
        <div>
         “””
        </div>
        <div>
        </div>
        <div>
         #### Libraries
        </div>
        <div>
         # Standard library
        </div>
        <div>
         import random
        </div>
        <div>
        </div>
        <div>
         # Third-party libraries
        </div>
        <div>
         import numpy as np
        </div>
        <div>
        </div>
        <div>
         class Network(object):
        </div>
        <div>
        </div>
        <div>
         def __init__(self, sizes):
        </div>
        <div>
         “””The list
         <code>
         </code>
         sizes
         <code>
         </code>
         contains the number of neurons in the
        </div>
        <div>
         respective layers of the network.  For example, if the list
        </div>
        <div>
         was [2, 3, 1] then it would be a three-layer network, with the
        </div>
        <div>
         first layer containing 2 neurons, the second layer 3 neurons,
        </div>
        <div>
         and the third layer 1 neuron.  The biases and weights for the
        </div>
        <div>
         network are initialized randomly, using a Gaussian
        </div>
        <div>
         distribution with mean 0, and variance 1.  Note that the first
        </div>
        <div>
         layer is assumed to be an input layer, and by convention we
        </div>
        <div>
         won’t set any biases for those neurons, since biases are only
        </div>
        <div>
         ever used in computing the outputs from later layers.”””
        </div>
        <div>
         self.num_layers = len(sizes)
        </div>
        <div>
         self.sizes = sizes
        </div>
        <div>
         self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
        </div>
        <div>
         self.weights = [np.random.randn(y, x)
        </div>
        <div>
         for x, y in zip(sizes[:-1], sizes[1:])]
        </div>
        <div>
        </div>
        <div>
         def feedforward(self, a):
        </div>
        <div>
         “””Return the output of the network if
         <code>
         </code>
         a
         <code>
         </code>
         is input.”””
        </div>
        <div>
         for b, w in zip(self.biases, self.weights):
        </div>
        <div>
         a = sigmoid(np.dot(w, a)+b)
        </div>
        <div>
         return a
        </div>
        <div>
        </div>
        <div>
         def SGD(self, training_data, epochs, mini_batch_size, eta,
        </div>
        <div>
         test_data=None):
        </div>
        <div>
         “””Train the neural network using mini-batch stochastic
        </div>
        <div>
         gradient descent.  The
         <code>
         </code>
         training_data
         <code>
         </code>
         is a list of tuples
        </div>
        <div>
         <code>
         </code>
         (x, y)
         <code>
         </code>
         representing the training inputs and the desired
        </div>
        <div>
         outputs.  The other non-optional parameters are
        </div>
        <div>
         self-explanatory.  If
         <code>
         </code>
         test_data
         <code>
         </code>
         is provided then the
        </div>
        <div>
         network will be evaluated against the test data after each
        </div>
        <div>
         epoch, and partial progress printed out.  This is useful for
        </div>
        <div>
         tracking progress, but slows things down substantially.”””
        </div>
        <div>
         if test_data: n_test = len(test_data)
        </div>
        <div>
         n = len(training_data)
        </div>
        <div>
         for j in xrange(epochs):
        </div>
        <div>
         random.shuffle(training_data)
        </div>
        <div>
         mini_batches = [
        </div>
        <div>
         training_data[k:k+mini_batch_size]
        </div>
        <div>
         for k in xrange(0, n, mini_batch_size)]
        </div>
        <div>
         for mini_batch in mini_batches:
        </div>
        <div>
         self.update_mini_batch(mini_batch, eta)
        </div>
        <div>
         if test_data:
        </div>
        <div>
         print “Epoch {0}: {1} / {2}”.format(
        </div>
        <div>
         j, self.evaluate(test_data), n_test)
        </div>
        <div>
         else:
        </div>
        <div>
         print “Epoch {0} complete”.format(j)
        </div>
        <div>
        </div>
        <div>
         def update_mini_batch(self, mini_batch, eta):
        </div>
        <div>
         “””Update the network’s weights and biases by applying
        </div>
        <div>
         gradient descent using backpropagation to a single mini batch.
        </div>
        <div>
         The
         <code>
         </code>
         mini_batch
         <code>
         </code>
         is a list of tuples
         <code>
         </code>
         (x, y)
         <code>
         </code>
         , and
         <code>
         </code>
         eta
         <code>
         </code>
        </div>
        <div>
         is the learning rate.”””
        </div>
        <div>
         nabla_b = [np.zeros(b.shape) for b in self.biases]
        </div>
        <div>
         nabla_w = [np.zeros(w.shape) for w in self.weights]
        </div>
        <div>
         for x, y in mini_batch:
        </div>
        <div>
         delta_nabla_b, delta_nabla_w = self.backprop(x, y)
        </div>
        <div>
         nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
        </div>
        <div>
         nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
        </div>
        <div>
         self.weights = [w-(eta/len(mini_batch))*nw
        </div>
        <div>
         for w, nw in zip(self.weights, nabla_w)]
        </div>
        <div>
         self.biases = [b-(eta/len(mini_batch))*nb
        </div>
        <div>
         for b, nb in zip(self.biases, nabla_b)]
        </div>
        <div>
        </div>
        <div>
         def backprop(self, x, y):
        </div>
        <div>
         “””Return a tuple
         <code>
         </code>
         (nabla_b, nabla_w)
         <code>
         </code>
         representing the
        </div>
        <div>
         gradient for the cost function C_x.
         <code>
         </code>
         nabla_b
         <code>
         </code>
         and
        </div>
        <div>
         <code>
         </code>
         nabla_w
         <code>
         </code>
         are layer-by-layer lists of numpy arrays, similar
        </div>
        <div>
         to
         <code>
         </code>
         self.biases
         <code>
         </code>
         and
         <code>
         </code>
         self.weights
         <code>
         </code>
         .”””
        </div>
        <div>
         nabla_b = [np.zeros(b.shape) for b in self.biases]
        </div>
        <div>
         nabla_w = [np.zeros(w.shape) for w in self.weights]
        </div>
        <div>
         # feedforward
        </div>
        <div>
         activation = x
        </div>
        <div>
         activations = [x] # list to store all the activations, layer by layer
        </div>
        <div>
         zs = [] # list to store all the z vectors, layer by layer
        </div>
        <div>
         for b, w in zip(self.biases, self.weights):
        </div>
        <div>
         z = np.dot(w, activation)+b
        </div>
        <div>
         zs.append(z)
        </div>
        <div>
         activation = sigmoid(z)
        </div>
        <div>
         activations.append(activation)
        </div>
        <div>
         # backward pass
        </div>
        <div>
         delta = self.cost_derivative(activations[-1], y) * \
        </div>
        <div>
         sigmoid_prime(zs[-1])
        </div>
        <div>
         nabla_b[-1] = delta
        </div>
        <div>
         nabla_w[-1] = np.dot(delta, activations[-2].transpose())
        </div>
        <div>
         # Note that the variable l in the loop below is used a little
        </div>
        <div>
         # differently to the notation in Chapter 2 of the book.  Here,
        </div>
        <div>
         # l = 1 means the last layer of neurons, l = 2 is the
        </div>
        <div>
         # second-last layer, and so on.  It’s a renumbering of the
        </div>
        <div>
         # scheme in the book, used here to take advantage of the fact
        </div>
        <div>
         # that Python can use negative indices in lists.
        </div>
        <div>
         for l in xrange(2, self.num_layers):
        </div>
        <div>
         z = zs[-l]
        </div>
        <div>
         sp = sigmoid_prime(z)
        </div>
        <div>
         delta = np.dot(self.weights[-l+1].transpose(), delta) * sp
        </div>
        <div>
         nabla_b[-l] = delta
        </div>
        <div>
         nabla_w[-l] = np.dot(delta, activations[-l-1].transpose())
        </div>
        <div>
         return (nabla_b, nabla_w)
        </div>
        <div>
        </div>
        <div>
         def evaluate(self, test_data):
        </div>
        <div>
         “””Return the number of test inputs for which the neural
        </div>
        <div>
         network outputs the correct result. Note that the neural
        </div>
        <div>
         network’s output is assumed to be the index of whichever
        </div>
        <div>
         neuron in the final layer has the highest activation.”””
        </div>
        <div>
         test_results = [(np.argmax(self.feedforward(x)), y)
        </div>
        <div>
         for (x, y) in test_data]
        </div>
        <div>
         return sum(int(x == y) for (x, y) in test_results)
        </div>
        <div>
        </div>
        <div>
         def cost_derivative(self, output_activations, y):
        </div>
        <div>
         “””Return the vector of partial derivatives \partial C_x /
        </div>
        <div>
         \partial a for the output activations.”””
        </div>
        <div>
         return (output_activations-y)
        </div>
        <div>
        </div>
        <div>
         #### Miscellaneous functions
        </div>
        <div>
         def sigmoid(z):
        </div>
        <div>
         “””The sigmoid function.”””
        </div>
        <div>
         return 1.0/(1.0+np.exp(-z))
        </div>
        <div>
        </div>
        <div>
         def sigmoid_prime(z):
        </div>
        <div>
         “””Derivative of the sigmoid function.”””
        </div>
        <div>
         return sigmoid(z)*(1-sigmoid(z))
        </div>
       </div>
       <div>
       </div>
       <div>
        7、神经网络如何优化：训练超参数与多种模型对比
       </div>
       <div>
        由以上分析可知，神经网络只需要74行代码就可以完成编程，可见机器学习真正困难的地方并不在编程，而在你对数学过程本身，和对它与现实问题的对应关系有深入的理解。理解深入后，你才能写出这样的程序，并对其进行精微的调优。
       </div>
       <div>
       </div>
       <div>
        我们初步的结果已经是94.76%的正确率了。但如果要将准确率提得更高怎么办？
       </div>
       <div>
       </div>
       <div>
        这其实是一个开放的问题，有许多方法都可以尝试。我们这里仅仅是抛砖引玉。
       </div>
       <div>
       </div>
       <div>
        首先，隐藏层只有30个节点。由我们之前对隐藏层的启发式理解可以猜测，神经网络的识别能力其实与隐藏层对一些细节的识别能力正相关。如果隐藏层的节点更多的话，其识别能力应该会更强的。那么我们设定100个隐藏层节点试试？
       </div>
       <div>
        <div>
         net = network.Network([784, 100, 10])
        </div>
        <div>
         net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
        </div>
       </div>
       <div>
       </div>
       <div>
        发现结果如下：
       </div>
       <div>
        <div>
         Epoch 0: 6669 / 10000
        </div>
        <div>
         Epoch 1: 6755 / 10000
        </div>
        <div>
         Epoch 2: 6844 / 10000
        </div>
        <div>
         Epoch 3: 6833 / 10000
        </div>
        <div>
         Epoch 4: 6887 / 10000
        </div>
        <div>
         Epoch 5: 7744 / 10000
        </div>
        <div>
         Epoch 6: 7778 / 10000
        </div>
        <div>
         Epoch 7: 7876 / 10000
        </div>
        <div>
         Epoch 8: 8601 / 10000
        </div>
        <div>
         Epoch 9: 8643 / 10000
        </div>
        <div>
         Epoch 10: 8659 / 10000
        </div>
        <div>
         Epoch 11: 8665 / 10000
        </div>
        <div>
         Epoch 12: 8683 / 10000
        </div>
        <div>
         Epoch 13: 8700 / 10000
        </div>
        <div>
         Epoch 14: 8694 / 10000
        </div>
        <div>
         Epoch 15: 8699 / 10000
        </div>
        <div>
         Epoch 16: 8715 / 10000
        </div>
        <div>
         Epoch 17: 8770 / 10000
        </div>
        <div>
         Epoch 18: 9611 / 10000
        </div>
        <div>
         Epoch 19: 9632 / 10000
        </div>
        <div>
         Epoch 20: 9625 / 10000
        </div>
        <div>
         Epoch 21: 9632 / 10000
        </div>
        <div>
         Epoch 22: 9651 / 10000
        </div>
        <div>
         Epoch 23: 9655 / 10000
        </div>
        <div>
         Epoch 24: 9653 / 10000
        </div>
        <div>
         Epoch 25: 9658 / 10000
        </div>
        <div>
         Epoch 26: 9653 / 10000
        </div>
        <div>
         Epoch 27: 9664 / 10000
        </div>
        <div>
         Epoch 28: 9655 / 10000
        </div>
        <div>
         Epoch 29: 9672 / 10000
        </div>
       </div>
       <div>
        发现，我们只是改了一个超参数，准确率就从94.76%提升到96.72%！
       </div>
       <div>
       </div>
       <div>
        这 里强调一下，更加规范的模型调优方法是将多个模型用交叉验证集的结果来横向比较，选出最优模型后再用一个新的测试集来最终评估该模型。本文为了与之前的结 果比较，才采用了测试集而不是交叉验证集。读者千万不要学博主这样做哈，因为这很有可能会过拟合。这是工程实践中数据挖掘人员经常犯的错误，我们之后会专 门写篇博文探讨。
       </div>
       <div>
       </div>
       <div>
        我们现在回来继续调优我们的模型。那么还有其他的隐藏节点数更合适吗？这个我们也不知道。常见的方法是用几何级数增长的数列（如：10，100，1000，……）去尝试，然后不断确定合适的区间，最终确定一个相对最优的值。
       </div>
       <div>
        但是即便如此，我们也只尝试了一个超参数，还有其他的超参数没有调优呢。我们于是尝试另一个超参数：步长。之前的步长是3.0，但是我们可能觉得学习速率太慢了。那么尝试一个更大的步长试试？比如100？
       </div>
       <div>
       </div>
       <div>
        <div>
         net = network.Network([784, 30, 10])
        </div>
        <div>
         net.SGD(training_data, 30, 10, 100.0, test_data=test_data)
        </div>
       </div>
       <div>
       </div>
       <div>
        发现结果如下：
       </div>
       <div>
        <div>
         Epoch 0: 1002 / 10000
        </div>
        <div>
         Epoch 1: 1002 / 10000
        </div>
        <div>
         Epoch 2: 1002 / 10000
        </div>
        <div>
         Epoch 3: 1002 / 10000
        </div>
        <div>
         Epoch 4: 1002 / 10000
        </div>
        <div>
         Epoch 5: 1002 / 10000
        </div>
        <div>
         Epoch 6: 1002 / 10000
        </div>
        <div>
         Epoch 7: 1002 / 10000
        </div>
        <div>
         Epoch 8: 1002 / 10000
        </div>
        <div>
         Epoch 9: 1002 / 10000
        </div>
        <div>
         Epoch 10: 1002 / 10000
        </div>
        <div>
         Epoch 11: 1002 / 10000
        </div>
        <div>
         Epoch 12: 1001 / 10000
        </div>
        <div>
         Epoch 13: 1001 / 10000
        </div>
        <div>
         Epoch 14: 1001 / 10000
        </div>
        <div>
         Epoch 15: 1001 / 10000
        </div>
        <div>
         Epoch 16: 1001 / 10000
        </div>
        <div>
         Epoch 17: 1001 / 10000
        </div>
        <div>
         Epoch 18: 1001 / 10000
        </div>
        <div>
         Epoch 19: 1001 / 10000
        </div>
        <div>
         Epoch 20: 1000 / 10000
        </div>
        <div>
         Epoch 21: 1000 / 10000
        </div>
        <div>
         Epoch 22: 999 / 10000
        </div>
        <div>
         Epoch 23: 999 / 10000
        </div>
        <div>
         Epoch 24: 999 / 10000
        </div>
        <div>
         Epoch 25: 999 / 10000
        </div>
        <div>
         Epoch 26: 999 / 10000
        </div>
        <div>
         Epoch 27: 999 / 10000
        </div>
        <div>
         Epoch 28: 999 / 10000
        </div>
        <div>
         Epoch 29: 999 / 10000
        </div>
       </div>
       <div>
       </div>
       <div>
        发现准确率低得不忍直视，看来步长设得太长了。根本跑不到最低点。那么我们设定一个小的步长试试？比如0.01。
       </div>
       <div>
        <div>
         net = network.Network([784, 100, 10])
        </div>
        <div>
         net.SGD(training_data, 30, 10, 0.001, test_data=test_data)
        </div>
       </div>
       <div>
       </div>
       <div>
        结果如下：
       </div>
       <div>
        <div>
         Epoch 0: 790 / 10000
        </div>
        <div>
         Epoch 1: 846 / 10000
        </div>
        <div>
         Epoch 2: 854 / 10000
        </div>
        <div>
         Epoch 3: 904 / 10000
        </div>
        <div>
         Epoch 4: 944 / 10000
        </div>
        <div>
         Epoch 5: 975 / 10000
        </div>
        <div>
         Epoch 6: 975 / 10000
        </div>
        <div>
         Epoch 7: 975 / 10000
        </div>
        <div>
         Epoch 8: 975 / 10000
        </div>
        <div>
         Epoch 9: 974 / 10000
        </div>
        <div>
         Epoch 10: 974 / 10000
        </div>
        <div>
         Epoch 11: 974 / 10000
        </div>
        <div>
         Epoch 12: 974 / 10000
        </div>
        <div>
         Epoch 13: 974 / 10000
        </div>
        <div>
         Epoch 14: 974 / 10000
        </div>
        <div>
         Epoch 15: 974 / 10000
        </div>
        <div>
         Epoch 16: 974 / 10000
        </div>
        <div>
         Epoch 17: 974 / 10000
        </div>
        <div>
         Epoch 18: 974 / 10000
        </div>
        <div>
         Epoch 19: 976 / 10000
        </div>
        <div>
         Epoch 20: 979 / 10000
        </div>
        <div>
         Epoch 21: 981 / 10000
        </div>
        <div>
         Epoch 22: 1004 / 10000
        </div>
        <div>
         Epoch 23: 1157 / 10000
        </div>
        <div>
         Epoch 24: 1275 / 10000
        </div>
        <div>
         Epoch 25: 1323 / 10000
        </div>
        <div>
         Epoch 26: 1369 / 10000
        </div>
        <div>
         Epoch 27: 1403 / 10000
        </div>
        <div>
         Epoch 28: 1429 / 10000
        </div>
        <div>
         Epoch 29: 1451 / 10000
        </div>
       </div>
       <div>
       </div>
       <div>
        呃，发现准确率同样低得不忍直视。但是有一个优点，准确率是稳步提升的。说明模型在大方向上应该还是对的。如果在调试模型的时候忽视了这个细节，你可能真的找不到合适的参数。
       </div>
       <div>
       </div>
       <div>
        可 见，我们第一次尝试的神经网络结构的超参数设定还是比较不错的。但是真实的应用场景中，基本没有这样好的运气，很可能刚开始测试出来的结果全是奇葩生物， 长得违反常理，就像来自另一个次元似的。这是数据挖掘工程师常见的情况。此时最应该做的，就是遏制住心中数万草泥马的咆哮奔腾，静静地观察测试结果的分布 规律，尝试找到些原因，再继续将模型试着调优下去，与此同时，做好从一个坑跳入下一个坑的心理准备。当然，在机器学习工程师前赴后继的填坑过程中，还是总 结出了一些调优规律。我们会在接下来专门写博文分析。
       </div>
       <div>
       </div>
       <div>
        当 然，以上的调优都没有逃出神经网络模型本身的范围。但是可不可能其他的模型效果更好？比如传说中的支持向量机？关于支持向量机的解读已经超越了本文的篇 幅，我们也考虑专门撰写博文分析。但是在这里我们只是引用一下在scikit-learn中提供好的接口，底层是用性能更好的C语言封装的著名的 LIBSVM。
       </div>
       <div>
        相关代码也在Michael Nielsen的文件中。直接引入，并运行一个方法即可。
       </div>
       <div>
        <div>
         import mnist_svm
        </div>
        <div>
         mnist_svm.svm_baseline()
        </div>
       </div>
       <div>
       </div>
       <div>
        我们看看结果：
       </div>
       <div>
        <div>
         Baseline classifier using an SVM.
        </div>
        <div>
         9435 of 10000 values correct.
        </div>
       </div>
       <div>
       </div>
       <div>
        94.35%，好像比我们的神经网络低一点啊。看来我们的神经网络模型还是更优秀一些？
       </div>
       <div>
       </div>
       <div>
        然 而，实际情况并非如此。因为我们用的只是scikit-learn给支持向量机的设好的默认参数。支持向量机同样有一大堆可调的超参数，以提升模型的效 果。 跟据 Andreas Mueller的这篇博文，调整好超参数的支持向量机能够达到98.5%的准确度！比我们刚才最好的神经网络提高了1.8个百分点！
       </div>
       <div>
       </div>
       <div>
        然而，故事并没有结束。2013年，通过深度神经网络，研究者可以达到99.79%的准确度！而且，他们并没有运用很多高深的技术。很多技术在我们接下来的博文中都可以继续介绍。
       </div>
       <div>
       </div>
       <div>
        所以，从目前的准确度来看：
       </div>
       <div>
        简单的支持向量机&lt;浅层神经网络&lt;调优的支持向量机&lt;深度神经网络
       </div>
       <div>
       </div>
       <div>
        但还是要提醒一下，炫酷的算法固然重要，但是良好的数据集有时候比算法更重要。Michael Nielsen专门写了一个公式来来表达他们的关系：
       </div>
       <div>
       </div>
       <div>
        精致的算法 ≤ 简单的算法 + 良好的训练数据
       </div>
       <div>
        sophisticated algorithm ≤ simple learning algorithm + good training data.
       </div>
       <div>
       </div>
       <div>
        所以为了调优模型，往往要溯源到数据本身，好的数据真的会有好的结果。
       </div>
       <div>
       </div>
       <div>
        作者介绍：
       </div>
       <div>
        龙心尘和寒小阳：从事机器学习/数据挖掘相关应用工作，热爱机器学习/数据挖掘
       </div>
      </div>
      <div>
       <strong>
        注：转载文章均来自于公开网络，仅供学习使用，不会用于任何商业用途，如果侵犯到原作者的权益，请您与我们联系删除或者授权事宜，联系邮箱：contact@dataunion.org。转载数盟网站文章请注明原文章作者，否则产生的任何版权纠纷与数盟无关。
       </strong>
      </div>
      <!--content_text-->
      <div class="fenxian">
       <!-- JiaThis Button BEGIN -->
       <div class="jiathis_style_32x32">
        <p class="jiathis_button_weixin">
        </p>
        <p class="jiathis_button_tsina">
        </p>
        <p class="jiathis_button_qzone">
        </p>
        <p class="jiathis_button_cqq">
        </p>
        <p class="jiathis_button_tumblr">
        </p>
        <a class="jiathis jiathis_txt jtico jtico_jiathis" href="http://www.jiathis.com/share" target="_blank">
        </a>
        <p class="jiathis_counter_style">
        </p>
       </div>
       <!-- JiaThis Button END -->
      </div>
     </article>
     <!--content-->
     <!--相关文章-->
     <div class="xianguan">
      <div class="xianguantitle">
       相关文章！
      </div>
      <ul class="pic">
       <li>
        <a href="http://dataunion.org/24663.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/095356be8cb4z9ke9389kd-204x200.jpeg"/>
        </a>
        <a class="link" href="http://dataunion.org/24663.html" rel="bookmark" title="人工智能界最强大脑畅谈AI未来之路">
         人工智能界最强大脑畅谈AI未来之路
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24652.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/02/20150522141422337-265x200.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24652.html" rel="bookmark" title="重磅 | MIT与谷歌专家合著论文：机器学习和神经科学的相互启发与融合（附论文）">
         重磅 | MIT与谷歌专家合著论文：机器学习和神经科学的相互启发与融合（附论文）
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24616.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/224806wllbe6tcimyyi9xt-300x167.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24616.html" rel="bookmark" title="微软人工智能计划背后的华人力量">
         微软人工智能计划背后的华人力量
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24562.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/8aac7ceb921d1684f06e6f65e2c1f224-300x173.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24562.html" rel="bookmark" title="各位大佬，别再拿人工智能当春药了！">
         各位大佬，别再拿人工智能当春药了！
        </a>
       </li>
      </ul>
     </div>
     <!--相关文章-->
     <div class="comment" id="comments">
      <!-- You can start editing here. -->
      <!-- If comments are open, but there are no comments. -->
      <div class="title">
       期待你一针见血的评论，Come on！
      </div>
      <div id="respond">
       <p>
        不用想啦，马上
        <a href="http://dataunion.org/wp-login.php?redirect_to=http%3A%2F%2Fdataunion.org%2F20992.html">
         "登录"
        </a>
        发表自已的想法.
       </p>
      </div>
     </div>
     <!-- .nav-single -->
    </div>
    <!--Container End-->
    <aside id="sitebar">
     <div class="sitebar_list2">
      <div class="wptag">
       <span class="tagtitle">
        热门标签+
       </span>
       <div class="tagg">
        <ul class="menu" id="menu-%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1605" id="menu-item-1605">
          <a href="http://taidizh.com/">
           泰迪智慧
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20884" id="menu-item-20884">
          <a href="http://www.transwarp.cn/">
           星环科技
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3538" id="menu-item-3538">
          <a href="http://datall.org/">
           珈和遥感
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20888" id="menu-item-20888">
          <a href="http://www.chinahadoop.cn/">
           小象学院
          </a>
         </li>
        </ul>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <div class="textwidget">
       <div align="center">
        <a href="http://study.163.com/course/courseMain.htm?courseId=991022" target="_blank">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/dv.jpg"/>
        </a>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       文章分类
      </h4>
      <div class="tagcloud">
       <a class="tag-link-44" href="http://dataunion.org/category/industry/demo" style="font-size: 10.204724409449pt;" title="4个话题">
        Demo展示
       </a>
       <a class="tag-link-31" href="http://dataunion.org/category/experts" style="font-size: 15.826771653543pt;" title="52个话题">
        专家团队
       </a>
       <a class="tag-link-870" href="http://dataunion.org/category/tech/ai" style="font-size: 19.795275590551pt;" title="273个话题">
        人工智能
       </a>
       <a class="tag-link-488" href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f" style="font-size: 8pt;" title="1个话题">
        加入数盟
       </a>
       <a class="tag-link-869" href="http://dataunion.org/category/tech/viz" style="font-size: 17.204724409449pt;" title="93个话题">
        可视化
       </a>
       <a class="tag-link-30" href="http://dataunion.org/category/partners" style="font-size: 10.645669291339pt;" title="5个话题">
        合作伙伴
       </a>
       <a class="tag-link-889" href="http://dataunion.org/category/parterc" style="font-size: 11.582677165354pt;" title="8个话题">
        合作会议
       </a>
       <a class="tag-link-104" href="http://dataunion.org/category/books" style="font-size: 12.96062992126pt;" title="15个话题">
        图书
       </a>
       <a class="tag-link-220" href="http://dataunion.org/category/tech/base" style="font-size: 19.850393700787pt;" title="281个话题">
        基础架构
       </a>
       <a class="tag-link-219" href="http://dataunion.org/category/tech/analysis" style="font-size: 19.409448818898pt;" title="232个话题">
        数据分析
       </a>
       <a class="tag-link-887" href="http://dataunion.org/category/tech/dm" style="font-size: 13.291338582677pt;" title="17个话题">
        数据挖掘
       </a>
       <a class="tag-link-34" href="http://dataunion.org/category/tech" style="font-size: 20.732283464567pt;" title="404个话题">
        文章
       </a>
       <a class="tag-link-1" href="http://dataunion.org/category/uncategorized" style="font-size: 22pt;" title="693个话题">
        未分类
       </a>
       <a class="tag-link-4" href="http://dataunion.org/category/events" style="font-size: 14.503937007874pt;" title="29个话题">
        活动
       </a>
       <a class="tag-link-890" href="http://dataunion.org/category/tech/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0" style="font-size: 10.204724409449pt;" title="4个话题">
        深度学习
       </a>
       <a class="tag-link-221" href="http://dataunion.org/category/tech/devl" style="font-size: 18.968503937008pt;" title="193个话题">
        编程语言
       </a>
       <a class="tag-link-888" href="http://dataunion.org/category/career" style="font-size: 15.661417322835pt;" title="48个话题">
        职业规划
       </a>
       <a class="tag-link-5" href="http://dataunion.org/category/jobs" style="font-size: 14.11811023622pt;" title="25个话题">
        职位
       </a>
       <a class="tag-link-871" href="http://dataunion.org/category/industry" style="font-size: 15.716535433071pt;" title="49个话题">
        行业
       </a>
       <a class="tag-link-613" href="http://dataunion.org/category/industry/case" style="font-size: 16.984251968504pt;" title="84个话题">
        行业应用
       </a>
       <a class="tag-link-885" href="http://dataunion.org/category/industry/news" style="font-size: 17.425196850394pt;" title="102个话题">
        行业资讯
       </a>
       <a class="tag-link-10" href="http://dataunion.org/category/training" style="font-size: 14.228346456693pt;" title="26个话题">
        课程
       </a>
       <a class="tag-link-16" href="http://dataunion.org/category/sources" style="font-size: 15.661417322835pt;" title="48个话题">
        资源
       </a>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       功能
      </h4>
      <ul>
       <li>
        <a href="http://dataunion.org/wp-login.php?action=register">
         注册
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/wp-login.php">
         登录
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/feed">
         文章
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/comments/feed">
         评论
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="https://cn.wordpress.org/" title="基于WordPress，一个优美、先进的个人信息发布平台。">
         WordPress.org
        </a>
       </li>
      </ul>
     </div>
    </aside>
    <div class="clear">
    </div>
   </div>
   <!--main-->
   ﻿
   <footer id="dibu">
    <div class="about">
     <div class="right">
      <ul class="menu" id="menu-%e5%ba%95%e9%83%a8%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18024" id="menu-item-18024">
        <a href="http://dataunion.org/category/partners">
         合作伙伴
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20881" id="menu-item-20881">
        <a href="http://dataunion.org/contribute">
         文章投稿
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20872" id="menu-item-20872">
        <a href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f">
         加入数盟
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22441" id="menu-item-22441">
        <a href="http://dataunion.org/f-links">
         友情链接
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20874" id="menu-item-20874">
        <a href="http://dataunion.org/aboutus">
         关于数盟
        </a>
       </li>
      </ul>
      <p class="banquan">
       数盟社区        ，
        做最棒的数据科学社区
      </p>
     </div>
     <div class="left">
      <ul class="bottomlist">
       <li>
        <a href="http://weibo.com/DataScientistUnion  " target="_blank" 　title="">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weibo.png"/>
        </a>
       </li>
       <li>
        <a class="cd-popup-trigger" href="http://dataunion.org/20992.html#0">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weixin.png"/>
        </a>
       </li>
      </ul>
      <div class="cd-popup">
       <div class="cd-popup-container">
        <h1>
         扫描二维码,加微信公众号
        </h1>
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/2014-12-06-1515289049.png"/>
        <a class="cd-popup-close" href="http://dataunion.org/20992.html">
        </a>
       </div>
       <!-- cd-popup-container -->
      </div>
      <!-- cd-popup -->
     </div>
    </div>
    <!--about-->
    <div class="bottom">
     <a href="http://dataunion.org/">
      数盟社区
     </a>
     <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank">
      京ICP备14026740号
     </a>
     联系我们：
     <a href="mailto:contact@dataunion.org" target="_blank">
      contact@dataunion.org
     </a>
     <div class="tongji">
     </div>
     <!--bottom-->
     <div class="scroll" id="scroll" style="display:none;">
      ︿
     </div>
    </div>
   </footer>
   <!--dibu-->
  </div>
 </body>
</html>